package com.itdianzi.service.cargo.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itdianzi.dao.cargo.ContractDao;
import com.itdianzi.dao.cargo.ContractProductDao;
import com.itdianzi.dao.cargo.ExtCproductDao;
import com.itdianzi.domain.cargo.*;
import com.itdianzi.service.cargo.ContractProductService;
import com.itdianzi.service.cargo.ExtCproductService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.UUID;

@com.alibaba.dubbo.config.annotation.Service
public class ContractProductServiceImpl implements ContractProductService {
    @Autowired
    private ContractProductDao contractProductDao;
    @Autowired
    private ContractDao contractDao;
    @Autowired
    private ExtCproductDao extCproductDao;
    @Override
    public void save(ContractProduct contractProduct) {

         // 保存方法
         // 一: 货物表
         //      1.计算货物的总金额
        Double amount=0d;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
            amount = contractProduct.getCnumber() * contractProduct.getPrice();
        }
         //      2.赋值给货物对象
        contractProduct.setAmount(amount);

         //      3.给货物id 保存货物
        contractProduct.setId(UUID.randomUUID().toString());
        contractProductDao.insertSelective(contractProduct);
         // 二: 合同表
        //查询到合同数据
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());

        //      4.修改总金额
        contract.setTotalAmount(contract.getTotalAmount() + amount);
         //      5.修改货物的数量种类
        contract.setProNum(contract.getProNum() + 1);
         //      6.保存到数据库
        contractDao.updateByPrimaryKeySelective(contract);


    }

    @Override
    public void update(ContractProduct contractProduct) {
                //修改货物
                //一 : 货物表
                //先查询原来的货物对象
        ContractProduct oldcontractProduct = contractProductDao.selectByPrimaryKey(contractProduct.getId());

        //     1.计算新的总金额
        Double amount=0d;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
            amount = contractProduct.getCnumber() * contractProduct.getPrice();
        }
                //     2.赋值给对象
        contractProduct.setAmount(amount);
                //     3.修改数据库中已经有的货物总金额数据
        contractProductDao.updateByPrimaryKeySelective(contractProduct);
                //二 : 合同表
                //     4.先查询合同表的数据
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());

        //     5.修改合同的总金额
                //            总金额= 原来的总金额 - 原来的货物金额 + 现在的货物的总金额
                //                     20总金额 其他的钱 + 鸡蛋10   鸡蛋半价
                //                     20 - 10  + 5
        contract.setTotalAmount(contract.getTotalAmount() - oldcontractProduct.getAmount() + amount);
                //     6.保存到数据库
        contractDao.updateByPrimaryKeySelective(contract);
    }

    @Override
    public void delete(String id) {

        //删除货物
        Double amount = 0d;
        // 1.货物表
        // 1.1 先获得货物对象
        ContractProduct contractProduct = contractProductDao.selectByPrimaryKey(id);
        //原来货物的金额
         amount = contractProduct.getAmount();
        // 1.2 删除货物对象
        contractProductDao.deleteByPrimaryKey(id);
        // 2.附件表
        // 2.1 先当前货物下所有的附件对象
        ExtCproductExample extCproductExample = new ExtCproductExample();
        ExtCproductExample.Criteria criteria = extCproductExample.createCriteria();
        criteria.andContractProductIdEqualTo(id);
        //根据货物ID查询出所有的附件对象
        List<ExtCproduct> extCproducts = extCproductDao.selectByExample(extCproductExample);

        // 2.2 删除附件对象
        if (!extCproducts.isEmpty()) {
            for (ExtCproduct extCproduct : extCproducts) {
                amount += extCproduct.getAmount();
                extCproductDao.deleteByPrimaryKey(extCproduct.getId());

            }
        }
        // 3.合同表
        // 3.1 获得合同对象
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());

        // 3.2 计算合同的金额
        contract.setTotalAmount(contract.getTotalAmount() - amount);
        // 3.3 计算货物数量 和 附件数量
        contract.setProNum(contract.getProNum() - 1);
        contract.setExtNum(contract.getExtNum() - extCproducts.size());
        // 3.4 保存到数据库
        contractDao.updateByPrimaryKeySelective(contract);
    }

    @Override
    public ContractProduct findById(String id) {
        ContractProduct contractProduct = contractProductDao.selectByPrimaryKey(id);
        return contractProduct;
    }

    @Override
    public PageInfo findAll(ContractProductExample example, int page, int size) {
        PageHelper.startPage(page, size);
        List<ContractProduct> contractProducts = contractProductDao.selectByExample(example);
        return new PageInfo(contractProducts);
    }

    @Override
    public void saveList(List<ContractProduct> contractProductList) {
        for (ContractProduct contractProduct : contractProductList) {

            save(contractProduct);
        }
    }

    @Override
    public List<ContractProduct> findAll(ContractProductExample example) {
        return contractProductDao.selectByExample(example);
    }
}
